package com.example.demo.util;

import com.example.demo.controller.data.ReturnData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;

import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class TokenUtil {

    @Autowired
    RedisTemplate redisTemplate;

    // 加密的字符串,相当于签名
    private static final String SINGNATURE_TOKEN = "PIESAT_TOKEN";

    /**
     * 将用户信息加密
     * */
    public static String encoder(String userInfo) {
        if (StringUtils.isEmpty(userInfo)) {
            return null;
        }
        // 获取编码器
        Base64.Encoder encoder = Base64.getEncoder();
        String singnatureBase64 = encoder.encodeToString(SINGNATURE_TOKEN.getBytes(StandardCharsets.UTF_8));
        String s = encoder.encodeToString(userInfo.getBytes());
        return singnatureBase64 + s;
    }


    /**
     * 根据Token获取用户信息  解码字符串
     *
     * @param token
     * @return
     */
    public static String decoder(String token) {
        if (StringUtils.isEmpty(token)) {
            return null;
        }
        try {
            // 获取编码器
            Base64.Encoder encoder = Base64.getEncoder();
            String singnatureBase64 = encoder.encodeToString(SINGNATURE_TOKEN.getBytes());
            token = token.replaceFirst(singnatureBase64, "");
            // 获取解码器
            Base64.Decoder decoder = Base64.getDecoder();
            // 对编码后的字符串进行解码
            byte[] decode = decoder.decode(token);
            String userinfo = new String(decode, StandardCharsets.UTF_8);
            return userinfo;
        }catch (Exception e){
            return "";
        }

    }

    /**
     * 获取对应的token
     * @param userInfo
     * @return
     */
    public static String getToken(String userInfo){
        long time = System.currentTimeMillis()+24*60*60*1000;
        return encoder(userInfo+"|"+time);
    }

    /**
     * 检测token是否有效
     * @param token
     * @return
     */
    public static ReturnData checkToken(String token){
        // 进行解密
        token = decoder(token);
        // 判断token有没有|这个符号
        if(!token.contains("|")){
            return ReturnData.error("token错误");
        }
        // 加两个斜杠才能识别是|，把token分割成两部分
        String[] strs = token.split("\\|");
        // 过期时间 Long.parseLong把字符串转化为数字
        long time = Long.parseLong(strs[1]);
        // 当前时间
        long now = System.currentTimeMillis();
        if(time<now){
            return ReturnData.error("token过期，请重新登录");
        }
        return ReturnData.success("成功");
    }

    /**
     * 检测token是否有效
     * @param token
     * @return 用户名
     */
    public static String getUsernameByToken(String token){
        token = decoder(token);//进行解密
        if(!token.contains("|")){//判断token有没有|这个符号
            return "";
        }
        String[] strs = token.split("\\|");//加两个斜杠才能识别是|，把token分割成两部分
        if(strs.length==0){
            return "";
        }
        return strs[0];
    }


    /**
     * 解密
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(decoder("UElFU0FUX1RPS0VOc3hpYW58MTcxMTAwMzc1MDQzOA=="));
    }
}
